{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 问题：什么是事务？\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "面试官想从这道题中考察面试人什么？\n",
    "事务在关系型数据库中是一个很重要的设计。\n",
    "\n",
    "答案\n",
    "事务（transaction）是指是程序中一系列严密的逻辑操作，而且所有操作必须全部成功完成，否则在每个操作中所作的所有更改都会被撤消。事务具有四个特性：原子性，一致性，隔离性和持久性。\n",
    "\n",
    "拓展\n",
    "关系数据库具有许多有趣且重要的功能，事务支持和 ACID 属性（原子性 Atomicity，一致性 Consistency，隔离性 Isolation 和持久性 Durability）就是其中之一。\n",
    "\n",
    "事务是在故障恢复期间被视为单个且不可分割（原子的）块的操作序列，并且在相同数据量的并发访问之间进行隔离。事务整体要么执行，要么不执行。\n",
    "\n",
    "因此，如果由于任何原因失败，则该事务可能对数据库所做的任何更改都将被撤消。这种属性称为原子性。\n",
    "\n",
    "事务是单个单元，不能将其操作与不参与事务的其他数据库操作合并。甚至单个SQL命令都涉及许多独立的数据库访问，并且事务可以由多个SQL命令组成。\n",
    "\n",
    "因此，数据库管理系统（DBMS）需要采取特殊的措施来确保事务正确运行，而不会受到同时运行的数据库命令的干扰。这就是隔离性。\n",
    "\n",
    "为了确保数据库系统不会因以后的失败而错过成功完成的事务，事务的操作必须在两次失败之间保持不变。此外，一项交易的结果只能由另一项交易撤消。此属性称为持久性。\n",
    "\n",
    "由于这三个属性，事务必须保留数据库的一致性，即第四个属性：一致性。\n",
    "\n",
    "使用事务的主要好处是数据完整性。许多数据库用途要求将数据存储到多个表，或将多个行存储到同一表，以维护一致的数据集。使用事务可确保与同一数据库的其他连接要么看到所有的更新数据，要么什么都看不到。这在连接中断的情况下也适用-如果在事务中间断电，则数据库引擎将回滚事务，因此就好像从未启动过一样。如果每个语句是独立提交的，则其他连接可能会看到部分更新，并且没有机会在错误时自动回滚。\n",
    "\n",
    "使用事务的第二个好处是速度。实际将数据提交到数据库通常会产生开销。如果您要插入1000行，那么与在所有插入之后提交一次相比，在每一行之后提交都会导致性能下降。当然，这也可以以其他方式起作用-如果在一个事务中进行了太多工作，则数据库引擎可能会占用大量空间来存储尚未提交的数据，或为其他数据库连接缓存数据，以维护一致性，这两种情况都会导致性能下降。与每次优化一样，如果您要更改交易范围以提高绩效，那么在更改前后都要进行衡量很重要。\n",
    "\n",
    "控制事务的语句有哪些呢？\n",
    "\n",
    "标识事务： START TRANSACTION\n",
    "\n",
    "回退事务启动后的操作： ROLLBACK\n",
    "\n",
    "提交： COMMIT\n",
    "\n",
    "Tips: 使用ROLLBACK或COMMIT后，事务会自动关闭\n",
    "\n",
    "设置保留点以方便回退到保留点： SAVEPOINT XXX\n",
    "\n",
    "延伸问题：实现 Redis 的事务命令\n",
    "答案：\n",
    "\n",
    ">multi   //开启一个事务\n",
    ">set age 10 //暂存指令队列\n",
    ">set age 20\n",
    ">exec    //开始执行（提交事务）\n",
    "或>discard //清空指令队列（事务回滚）"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}